package com.example.demo.controller;

import com.example.demo.common.ResultAjax;
import com.example.demo.common.SessionUtils;
import com.example.demo.model.Articleinfo;
import com.example.demo.model.Userinfo;
import com.example.demo.model.vo.ArticleinfoVO;
import com.example.demo.model.vo.UserinfoVO;
import com.example.demo.service.ArticleService;
import com.example.demo.service.UserService;
import org.apache.catalina.User;
import org.apache.logging.log4j.message.ReusableMessage;
import org.apache.tomcat.util.http.parser.HttpParser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.xml.transform.Result;
import java.awt.geom.RectangularShape;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: WHY
 * Date: 2023-09-16
 * Time: 19:06
 */
@RestController
@RequestMapping("/art")
public class ArticleController {

    @Autowired
    private ArticleService articleService;
    private static final int _DESC_LENGTH=120;//文章简介的长度
    @Autowired
    private ThreadPoolTaskExecutor taskExecutor;
    @Autowired
    private UserService userService;
    //获取当前用户登录的文章列表
    @RequestMapping("/mylist")
    public ResultAjax myList(HttpServletRequest request){
        //得到当前登录用户
        Userinfo userinfo= SessionUtils.getUser(request);
        if(userinfo==null){
            return ResultAjax.fail(-1,"请先登录!");
        }
        //根据用户id查询此用户发表的所有文章
    List<Articleinfo>  list=articleService.getListByUid(userinfo.getId());
        //使用多线程处理list,将文章正文变成简介
        if(list!=null&&list.size()>0){
            //并行处理list集合
            list.stream().parallel().forEach((art)->{
                if(art.getContent().length()>_DESC_LENGTH){
                    art.setContent(art.getContent().substring(0,120));
                }
            });
        }
        //结果返回给前端
        return ResultAjax.success(list);
    }
    /**
     * 删除文章
     */

    @RequestMapping("/del")
    public ResultAjax del(Integer aid,HttpServletRequest request){
        //1.参数校验
        if(aid==null||aid<0){
            return ResultAjax.fail(-1,"参数错误!");
        }
        //2.得到当前登录的用户
        Userinfo userinfo=SessionUtils.getUser(request);
        if(userinfo==null){
            return ResultAjax.fail(-1,"请先登录!");
        }
        //3.删除文章的归属人+删除操作
        int result=articleService.del(aid,userinfo.getId());
        //4.将结果返回给前端

        return ResultAjax.success(result);
    }
    /**
     * 添加文章
     */
    @RequestMapping("/add")

    public ResultAjax add(Articleinfo articleinfo,HttpServletRequest request){
        //1.校验参数
        if(articleinfo==null||!StringUtils.hasLength(articleinfo.getTitle())
        ||!StringUtils.hasLength(articleinfo.getContent())){
            return ResultAjax.fail(-1,"非法参数!");
        }

        //2.组装数据
        Userinfo userinfo=SessionUtils.getUser(request);
        if(userinfo==null){
            return ResultAjax.fail(-2,"请先登录!");
        }
        articleinfo.setUid(userinfo.getId());

        //3.将数据入库
        int result=articleService.add(articleinfo);
        //4.将数据返回给前端
        return ResultAjax.success(result);

    }
    /**
     * 查询自己发表的文章详情
     */
    @RequestMapping("/update_init")
    public ResultAjax updateInit(Integer aid,HttpServletRequest request){
            //1.参数校验
        if(aid==null||aid<=0){
            return ResultAjax.fail(-1,"参数有误!");
        }
        //2.得到当前用户登录id
            Userinfo userinfo=SessionUtils.getUser(request);
        if(userinfo==null){
            return ResultAjax.fail(-2,"请先登录!");
        }
        //3.查询文章并校验权限,where id=#{aid} and uid=#{uid}
        Articleinfo articleinfo=articleService.getArticleIdAndUid(aid,userinfo.getId());
        //4.将结果返回给前端
        return ResultAjax.success(articleinfo);


    }
    /**
     * 修改文章
     */
    @RequestMapping("/update")
    public ResultAjax update(Articleinfo articleinfo, HttpServletRequest request){
        //1.参数校验
        if(articleinfo==null||!StringUtils.hasLength(articleinfo.getTitle())||
                !StringUtils.hasLength(articleinfo.getContent())||
                articleinfo.getId()==0){
            return ResultAjax.fail(-1,"非法参数!");
        }

        //2.获取登录用户
        Userinfo userinfo=SessionUtils.getUser(request);
        if(userinfo==null){
            return ResultAjax.fail(-2,"请先登录!");
        }
        articleinfo.setUid(userinfo.getId());
        //3.执行修改操作并校验归属人
        int result=articleService.update(articleinfo);
        //4.将结果返回给前端
        return ResultAjax.success(result);
    }
    /**
     * 查询文章详情页
     */
    @RequestMapping("/detail")
    public ResultAjax detail(Integer aid) throws ExecutionException, InterruptedException {
        //1.参数校验
        if(aid==null|| aid<=0){
            return ResultAjax.fail(-1,"非法参数!");
        }
        //2.查询文章详情
        Articleinfo articleinfo=articleService.getDetail(aid);
        if(articleinfo==null|| articleinfo.getId()<=0){
            return ResultAjax.fail(-1,"非法参数!");

        }
        //3.根据uid查询用户的详情
        FutureTask<UserinfoVO> userTask=new FutureTask(()->{
            return userService.getUserById(articleinfo.getUid());
        });
        taskExecutor.submit(userTask);
        //4.根据uid查询用户发表的总文章数
        FutureTask<Integer> artCountTask=new FutureTask(()->{
            return articleService.getArtCountByUid(articleinfo.getUid());
        });
        taskExecutor.submit(artCountTask);
    //5.组装数据
        UserinfoVO userinfoVO=userTask.get();
        int artCount=artCountTask.get();//等待线程池执行完成
        userinfoVO.setArtCount(artCount);//等待线程池执行完成
        HashMap<String ,Object> result=new HashMap<>();

        result.put("user",userinfoVO);
        result.put("art",articleinfo);
        //6.返回结果给前端

       return ResultAjax.success(result);
    }
    @RequestMapping("/increment_rcount")
    public ResultAjax incrementRCount(Integer aid){
        //1.校验参数
        if(aid==null||aid<=0){
            return ResultAjax.fail(-1,"参数有误!");
        }

        //2.更改数据库
        int result=articleService.incrementRCount(aid);
        //3.返回结果
        return ResultAjax.success(result);
    }

    /**
     * 查询分页功能
     *
     */
    @RequestMapping("/getlistbypage")
    public ResultAjax getListByPage(Integer pindex,Integer psize) throws ExecutionException, InterruptedException {
        //1.加工参数
        if(pindex==null||pindex<1){
            //参数矫正
            pindex=1;
        }
        if(psize==null||psize<1){
            psize=2;
        }

        //2.并发进行文章列表和总页数的查询
        //2.1查询分页列表数据
        int offset=psize*(pindex -1);//分页公式
        int finalPSize=psize;
        FutureTask<List<Articleinfo>> listTask=new FutureTask(()->{

            return articleService.getListByPage(finalPSize,offset);
        });

        //计算总页数
        //2.2查询总页数
        FutureTask<Integer> sizeTask=new FutureTask<>(()->{
            //总条数
            int totalCount=articleService.getCount();
            double  sizeTemp=(totalCount*1.0)/(finalPSize*1.0);
            return (int) Math.ceil(sizeTemp);

        });

        taskExecutor.submit(listTask);
        taskExecutor.submit(sizeTask);
        //3.组装数据
      List<Articleinfo> list= listTask.get();
      int size=sizeTask.get();
      HashMap<String,Object> map=new HashMap<>();
      map.put("list",list);
      map.put("size",size);
        //4.将结果返回给前端
        return ResultAjax.success(map);
    }



}
